<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="Pqo8y" id="Pqo8y"><span data-lake-id="u326400d0" id="u326400d0">典型回答</span></h1>
  <p data-lake-id="u55ade4a0" id="u55ade4a0"><br></p>
  <p data-lake-id="uf23889c0" id="uf23889c0"><span data-lake-id="u596a8d15" id="u596a8d15">全链路压测诞生于阿里巴巴双11备战过程，如果说双11大促是阿里业务的“期末考试”，全链路压测就是大考前的“模拟考试”。全链路压测通过在生产环境对业务大流量场景进行高仿真模拟，获取最真实的线上实际承载能力、执行精准的容量规划，确保系统可用性。</span></p>
  <p data-lake-id="ue86ccd83" id="ue86ccd83"><span data-lake-id="ua781171f" id="ua781171f">​</span><br></p>
  <p data-lake-id="u00e9322a" id="u00e9322a"><span data-lake-id="uf7e97384" id="uf7e97384">因为对于像阿里这种大型互联网公司来说，尤其是电商业务，一个业务流程涉及到的上下游实在是太多了。任何一个节点都可能成为整个系统的瓶颈。</span></p>
  <p data-lake-id="u0bccbc5d" id="u0bccbc5d"><span data-lake-id="u56656efe" id="u56656efe">​</span><br></p>
  <p data-lake-id="ue8bf5dc7" id="ue8bf5dc7"><span data-lake-id="ud5d3da60" id="ud5d3da60">而在单链路压测时，往往只关注自己的系统，就会不可避免忽略掉一些资源竞争及外部干扰，最终得到一个过于乐观的结果。</span></p>
  <p data-lake-id="u4680643c" id="u4680643c"><span data-lake-id="udda2e6ce" id="udda2e6ce">​</span><br></p>
  <p data-lake-id="u8c425b3b" id="u8c425b3b"><span data-lake-id="u14a4efa5" id="u14a4efa5">并且在分布式场景中，我们和上下游之间的依赖关系错综复杂，只有在全链路压测中才能真正的暴露出真实环境中的各种问题。</span></p>
  <p data-lake-id="uf5370f8b" id="uf5370f8b"><br></p>
  <p data-lake-id="u7779cedb" id="u7779cedb"><span data-lake-id="u8e7bb308" id="u8e7bb308">全链路压测可以从网络到Nginx反向代理、到应用服务器、系统间依赖、数据库、缓存、磁盘等全方位的找出系统瓶颈。</span></p>
  <p data-lake-id="u017005f9" id="u017005f9"><span data-lake-id="u271b7289" id="u271b7289">​</span><br></p>
  <p data-lake-id="ua56d830c" id="ua56d830c"><span data-lake-id="u948c8dea" id="u948c8dea">但是全链路压测和单链路压测有个比较大的不同，那就是对于很多下游系统来说，他需要能识别出压测流量，一方面可以对这些流量做一些特殊处理，比如某个系统大促当天会被降级，那么他就可以直接把压测流量过滤掉，不参加压测。</span></p>
  <p data-lake-id="ue09852fe" id="ue09852fe"><span data-lake-id="u92af379c" id="u92af379c">​</span><br></p>
  <p data-lake-id="u5d8b3473" id="u5d8b3473"><span data-lake-id="u0fe3cf21" id="u0fe3cf21">还有就是，很多时候压测都不仅仅是读操作，还有很多写操作，那就会在很多系统中产生数据，那么就需要把这部分流量识别出来，把这部分数据做好隔离。</span></p>
  <p data-lake-id="u36274a62" id="u36274a62"><span data-lake-id="uc4a66c32" id="uc4a66c32">​</span><br></p>
  <p data-lake-id="u5dce9d27" id="u5dce9d27"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690893717213-77849a0f-cafe-4ac8-891a-95a6ff0bb835.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_64%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u53b16afb" id="u53b16afb"><span data-lake-id="u4da94647" id="u4da94647">​</span><br></p>
  <p data-lake-id="u4c131340" id="u4c131340"><span data-lake-id="uf08e1fa8" id="uf08e1fa8">所以，全链路压测中比较重要的就是流量识别及数据隔离。</span></p>
  <p data-lake-id="u6cdfd63a" id="u6cdfd63a"><span data-lake-id="u512258af" id="u512258af">​</span><br></p>
  <h3 data-lake-id="dSYja" id="dSYja"><span data-lake-id="u84933b2f" id="u84933b2f">流量识别</span></h3>
  <p data-lake-id="u31a7f569" id="u31a7f569"><br></p>
  <p data-lake-id="u8f4d6719" id="u8f4d6719"><span data-lake-id="u9b8cf6d7" id="u9b8cf6d7">在流量识别方面，一般都是通过流量染色实现的，其实就是对各种服务框架进行改造，比如DUBBO、REDIS、TDDL、MQ等所有的系统间交互以及存储等需要用到的组件中做改造。</span></p>
  <p data-lake-id="uc59795a7" id="uc59795a7"><span data-lake-id="u4e14415f" id="u4e14415f">​</span><br></p>
  <p data-lake-id="u04d186a2" id="u04d186a2"><span data-lake-id="uc5df60fb" id="uc5df60fb">比如定义一个特殊的字段，如full_chain_stress_tag，把他在整个链路中都传递下去，然后这样各个系统就可以有效的识别出压测流量了。</span></p>
  <p data-lake-id="u4a9828e4" id="u4a9828e4"><span data-lake-id="u18664085" id="u18664085">​</span><br></p>
  <p data-lake-id="u400855fd" id="u400855fd"><span data-lake-id="u04700501" id="u04700501">这个也可以和分布式链路追踪结合着来做，理论上大家要该干的事儿是一样的。</span></p>
  <p data-lake-id="u8d53336c" id="u8d53336c"><span data-lake-id="ud1664aca" id="ud1664aca">​</span><br></p>
  <p data-lake-id="u8cd32f32" id="u8cd32f32"><span data-lake-id="u1cc97cc3" id="u1cc97cc3">​</span><br></p>
  <h3 data-lake-id="lpllj" id="lpllj"><span data-lake-id="u94927b33" id="u94927b33">数据隔离</span></h3>
  <p data-lake-id="uc95a25ce" id="uc95a25ce"><br></p>
  <p data-lake-id="u58fa1b18" id="u58fa1b18"><span data-lake-id="ud3226298" id="ud3226298">数据隔离一般都是用影子表。比如我们有一张order表，那么在压测前就需要创建一张order__shadow表，作为他的影子表。</span></p>
  <p data-lake-id="uff0db933" id="uff0db933"><span data-lake-id="u9b417ab3" id="u9b417ab3">​</span><br></p>
  <p data-lake-id="u208d73b3" id="u208d73b3"><span data-lake-id="ue9ab9c2d" id="ue9ab9c2d">这样在数据库持久层，就需要识别出压测流量，然后把压测数据写入到影子表中。这样就可以避免对真实数据产生影响。</span></p>
  <p data-lake-id="uc76802f8" id="uc76802f8"><span data-lake-id="ue0a0d3dc" id="ue0a0d3dc">​</span><br></p>
  <p data-lake-id="u00ea5e07" id="u00ea5e07"><span data-lake-id="uef746ca6" id="uef746ca6">​</span><br></p>
  <p data-lake-id="u8aa7658e" id="u8aa7658e" style="text-align: center"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690893016608-8d28e5d4-b450-49ce-9c01-2f6640f7492e.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_31%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ubb626ac4" id="ubb626ac4"><br></p>
  <p data-lake-id="ua1144a36" id="ua1144a36"><br></p>
  <p data-lake-id="u60f16c94" id="u60f16c94"><span data-lake-id="u86f72166" id="u86f72166">除了数据库，还有缓存，也一样，也需要识别压测流量，然后写入到对应的影子缓存中。还有日志，如果有需要，也可以做隔离。</span></p>
  <p data-lake-id="ud4bbdf1b" id="ud4bbdf1b"><span data-lake-id="u5d30f3cc" id="u5d30f3cc">​</span><br></p>
  <p data-lake-id="u55e6baa5" id="u55e6baa5"><span data-lake-id="ub2f9eaed" id="ub2f9eaed">​</span><br></p>
  <h3 data-lake-id="vMtvj" id="vMtvj"><span data-lake-id="ufb2d8660" id="ufb2d8660">工具</span></h3>
  <p data-lake-id="udd8c7e08" id="udd8c7e08"><br></p>
  <p data-lake-id="u70870363" id="u70870363"><span data-lake-id="u60131256" id="u60131256">目前市面上可以用的全链路压测工具有Takin、Quake（美团）、Rhino（字节）、ForceBot</span></p>
  <p data-lake-id="ua4448069" id="ua4448069"><span data-lake-id="u877bbb53" id="u877bbb53">​</span><br></p>
  <p data-lake-id="uf29fb2bb" id="uf29fb2bb"><span data-lake-id="ub2f88519" id="ub2f88519">以下是一些行业内大厂的一些压测的分享（外链）：</span></p>
  <p data-lake-id="u7b971abf" id="u7b971abf"><span data-lake-id="u0b8fa194" id="u0b8fa194">​</span><br></p>
  <ul list="u329515e2">
   <li fid="ued2927f6" data-lake-id="uc8c570b9" id="uc8c570b9"><a href="https://zhuanlan.zhihu.com/p/27211011" target="_blank" data-lake-id="u96412361" id="u96412361"><span data-lake-id="u68790ed9" id="u68790ed9">史上最复杂业务场景，逼出阿里高可用三大法宝</span></a></li>
   <li fid="ued2927f6" data-lake-id="u46bd8c26" id="u46bd8c26"><a href="https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&amp;mid=2650995093&amp;idx=1&amp;sn=574f6d83a48c2c596943b1fbeb25e4a7&amp;chksm=bdbf01c68ac888d03eadfff1475e782ac8e289ad62bfe5cfe15542105fcdd8f6dfb6e2da7afa&amp;scene=21#wechat_redirect" target="_blank" data-lake-id="ud030d713" id="ud030d713"><span data-lake-id="udcca0cd0" id="udcca0cd0">阿里双十一大促，技术准备只做了这两件事情？</span></a></li>
   <li fid="ued2927f6" data-lake-id="u6c2a9c4b" id="u6c2a9c4b"><a href="https://developer.aliyun.com/article/723177" target="_blank" data-lake-id="u7d5c99c8" id="u7d5c99c8"><span data-lake-id="ufb36b4ef" id="ufb36b4ef">独家揭秘 | 阿里怎么做双11全链路压测？</span></a></li>
   <li fid="ued2927f6" data-lake-id="u6ad10fae" id="u6ad10fae"><a href="https://juejin.im/entry/6844903713773977614" target="_blank" data-lake-id="u1b90514e" id="u1b90514e"><span data-lake-id="u214ed3fd" id="u214ed3fd">10年5次进化，双11容量规划如何实现成本与稳定的最佳平衡？</span></a></li>
   <li fid="ued2927f6" data-lake-id="u9686b40b" id="u9686b40b"><a href="https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&amp;mid=2247486698&amp;idx=3&amp;sn=c3a2af9322c2bf6ad25d8c4823d1461f&amp;chksm=fdeb3e8aca9cb79c3ff4f0d61eed4db4e7fd72c54e0ef670ad9d4c12caa05000dec80bbd179a&amp;scene=21#wechat_redirect" target="_blank" data-lake-id="u86d2f7fa" id="u86d2f7fa"><span data-lake-id="ue4925fc0" id="ue4925fc0">阿里巴巴高可用技术专家襄玲：压测环境的设计和搭建</span></a></li>
   <li fid="ued2927f6" data-lake-id="ua2066730" id="ua2066730"><a href="https://mp.weixin.qq.com/s/vofrpFGvnptj3MNAv1hQ-w" target="_blank" data-lake-id="ud788c66f" id="ud788c66f"><span data-lake-id="uf5313eaa" id="uf5313eaa">字节跳动全链路压测(Rhino)的实践</span></a></li>
   <li fid="ued2927f6" data-lake-id="ufe61e5c4" id="ufe61e5c4"><a href="https://tech.meituan.com/2018/09/27/quake-introduction.html" target="_blank" data-lake-id="u7b364d6f" id="u7b364d6f"><span data-lake-id="u947f8d3d" id="u947f8d3d">全链路压测平台（Quake）在美团中的实践</span></a></li>
   <li fid="ued2927f6" data-lake-id="u45fe0a58" id="u45fe0a58"><a href="https://github.com/panjianning/performance-test/blob/master/%E4%BA%AC%E4%B8%9C%E5%85%A8%E9%93%BE%E8%B7%AF%E5%8E%8B%E6%B5%8B%E5%86%9B%E6%BC%94%E7%B3%BB%E7%BB%9F(ForceBot).pdf" target="_blank" data-lake-id="u608db4d1" id="u608db4d1"><span data-lake-id="ueb07b731" id="ueb07b731">京东全链路压测军演系统(ForceBot)</span></a></li>
   <li fid="ued2927f6" data-lake-id="uc6391b84" id="uc6391b84"><a href="https://zhuanlan.zhihu.com/p/30306892" target="_blank" data-lake-id="ubebd8c8c" id="ubebd8c8c"><span data-lake-id="u59641730" id="u59641730">饿了么全链路压测的探索与实践</span></a></li>
   <li fid="ued2927f6" data-lake-id="u9007fce6" id="u9007fce6"><a href="https://github.com/panjianning/performance-test/blob/master/%E6%90%BA%E7%A8%8B%E5%85%A8%E9%93%BE%E8%B7%AF%E6%B5%8B%E8%AF%95%E5%AE%9E%E8%B7%B5.pdf" target="_blank" data-lake-id="ub4983a46" id="ub4983a46"><span data-lake-id="u655944da" id="u655944da">携程全链路测试实践</span></a></li>
   <li fid="ued2927f6" data-lake-id="u7fc75dbb" id="u7fc75dbb"><a href="https://cloud.tencent.com/developer/article/1510088" target="_blank" data-lake-id="ud86658f9" id="ud86658f9"><span data-lake-id="ud86df0a8" id="ud86df0a8">有赞全链路压测实战</span></a></li>
  </ul>
  <p data-lake-id="u3fd8d2f3" id="u3fd8d2f3"><br></p>
 </body>
</html>